home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / ISSUE17 / CGI / BLDSQL.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-11-24  |  4.8 KB  |  147 lines

  1. unit BldSql;
  2.  
  3. interface
  4.  
  5. uses
  6.   Classes, SysUtils;
  7.  
  8. procedure BuildSQL(ArticleType: string;
  9.                    AuthorName: string;
  10.                    IssueNumber: string;
  11.                    KeywordSelect: string;
  12.                    KeywordSearch: string;
  13.                    QueryText: TStrings);
  14.  
  15. implementation
  16.  
  17. procedure BuildSQL(ArticleType: string;
  18.                    AuthorName: string;
  19.                    IssueNumber: string;
  20.                    KeywordSelect: string;
  21.                    KeywordSearch: string;
  22.                    QueryText: TStrings);
  23. { Accepts the criteria values and returns the proper SQL statement in QueryText.
  24.   Input values are expected to be empty strings if they are not used in the
  25.   selection criteria.  QueryText is expected to be properly allocated. }
  26. var
  27.   QueryStr: String;
  28.   Where: Boolean;
  29.   I: Integer;
  30.   CheckArticleType: Boolean;
  31.   CheckAuthorName: Boolean;
  32.   CheckIssueNumber: Boolean;
  33.   CheckKeywordSelect: Boolean;
  34.   CheckKeywordSearch: Boolean;
  35. begin
  36.   CheckArticleType := ArticleType <> '';
  37.   CheckAuthorName := AuthorName <> '';
  38.   CheckIssueNumber := IssueNumber <> '';
  39.   CheckKeywordSelect := KeywordSelect <> '';
  40.   CheckKeywordSearch := KeywordSearch <> '';
  41.   KeywordSearch := Uppercase(KeywordSearch);
  42.   if CheckKeywordSelect and CheckKeywordSearch then
  43.     CheckKeywordSearch := False;
  44.  
  45.   QueryText.Clear;
  46.   QueryText.Add('SELECT ARTICLE.*');
  47.  
  48.   if CheckKeywordSelect and not CheckKeywordSearch
  49.     then QueryText.Add('FROM ARTICLE, KEYWORD')
  50.     else QueryText.Add('FROM ARTICLE');
  51.  
  52.   if CheckAuthorName then { look for three authors }
  53.   begin
  54.     for I := 1 to 3 do { "Author i" }
  55.     begin
  56.       if I = 1 then QueryText.Add('WHERE (')
  57.                else QueryText.Add(') OR (');
  58.       QueryText.Add(' (ARTICLE."Author '+IntToStr(I)+'" = '+AuthorName+')');
  59.  
  60.       if CheckArticleType then
  61.       begin
  62.         QueryText.Add('  AND');
  63.         QueryText.Add(' (ARTICLE."Article Type" = "' + ArticleType + '")');
  64.       end;
  65.  
  66.       if CheckIssueNumber then
  67.       begin
  68.         QueryText.Add('  AND');
  69.         QueryText.Add(' (ARTICLE."Issue #" = ' + IssueNumber + ')');
  70.       end;
  71.  
  72.       if CheckKeywordSearch then
  73.       begin
  74.         { The subquery used here is not supported by the 16-bit BDE }
  75.         QueryText.Add('  AND');
  76.         {$IFDEF WIN32}
  77.         QueryText.Add(' (ARTICLE."Article ID" IN');
  78.         QueryText.Add(' (SELECT DISTINCT Keyword."Article ID" FROM KEYWORD');
  79.         QueryText.Add('  WHERE UPPER(Keyword) LIKE  "%' + KeywordSearch + '%"))');
  80.         {$ELSE}
  81.         QueryText.Add(' (ARTICLE."Article ID" = KEYWORD."Article ID")');
  82.         QueryText.Add('  AND');
  83.         QueryText.Add(' (KEYWORD."Keyword" LIKE "%' + KeywordSearch + '%")');
  84.         {$ENDIF}
  85.       end;
  86.  
  87.       if (CheckKeywordSelect and not CheckKeywordSearch) then
  88.       begin
  89.         { do not use keyword list if key _search_ has been used }
  90.         QueryText.Add('  AND');
  91.         QueryText.Add(' (ARTICLE."Article ID" = KEYWORD."Article ID")');
  92.         QueryText.Add('  AND');
  93.         QueryText.Add(' (KEYWORD."Keyword" = "' + KeywordSelect + '")');
  94.       end
  95.     end;
  96.     QueryText.Add(')');
  97.   end
  98.   else { don't look for authors }
  99.   begin
  100.     Where := False;
  101.  
  102.     if CheckKeywordSearch then
  103.     begin
  104.       {$IFDEF WIN32}
  105.       QueryText.Add('WHERE (ARTICLE."Article ID" IN');
  106.       QueryText.Add(' (SELECT DISTINCT Keyword."Article ID" FROM KEYWORD');
  107.       QueryText.Add('  WHERE UPPER(Keyword) LIKE  "%' + KeywordSearch + '%"))');
  108.       {$ELSE}
  109.       QueryText.Add(' (ARTICLE."Article ID" = KEYWORD."Article ID")');
  110.       QueryText.Add('  AND');
  111.       QueryText.Add(' (KEYWORD."Keyword" LIKE "%' + KeywordSearch + '%")');
  112.       {$ENDIF}
  113.       Where := True;
  114.     end;
  115.  
  116.     if (CheckKeywordSelect and not CheckKeywordSearch) then
  117.     begin
  118.       { do not use keyword list if key _search_ has been used }
  119.       QueryText.Add('WHERE (ARTICLE."Article ID" =');
  120.       QueryText.Add('       KEYWORD."Article ID")');
  121.       QueryText.Add('  AND (KEYWORD."Keyword" = "' + KeywordSelect + '")');
  122.       Where := True;
  123.     end;
  124.  
  125.     QueryStr := '';
  126.     if CheckArticleType then
  127.     begin
  128.       if not Where then QueryStr := QueryStr + 'WHERE '
  129.                    else QueryStr := QueryStr + '  AND ';
  130.       Where := True;
  131.       QueryStr := QueryStr+'(ARTICLE."Article Type" = "'+ArticleType+'")'#13#10
  132.     end;
  133.  
  134.     if CheckIssueNumber then
  135.     begin
  136.       if not Where then QueryStr := QueryStr + 'WHERE '
  137.                    else QueryStr := QueryStr + '  AND ';
  138.       Where := True;
  139.       QueryStr := QueryStr+'(ARTICLE."Issue #" = '+IssueNumber+')'#13#10
  140.     end;
  141.     QueryText.Add(QueryStr);
  142.   end;
  143.   QueryText.Add('ORDER BY ARTICLE."Issue #", ARTICLE."Page Number"');
  144. end;
  145.  
  146. end.
  147.